/*给你两个单链表的头节点 headA 和 headB ，请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点，返回 null 。
* 题目数据 保证 整个链式结构中不存在环。注意，函数返回结果后，链表必须 保持其原始结构 。
*
* 输入：intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
* 输出：Intersected at '8'
* 解释：相交节点的值为 8 （注意，如果两个链表相交则不能为 0）。
* 从各自的表头开始算起，链表 A 为 [4,1,8,4,5]，链表 B 为 [5,0,1,8,4,5]。
* 在 A 中，相交节点前有 2 个节点；在 B 中，相交节点前有 3 个节点。
* */

package Leetcode;

import java.awt.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class leetcode160 {

    public static void main(String[] args) {

        leetcode160 obj = new leetcode160();
        ListNode headA = new ListNode(4);
        headA.add(1);
        headA.add(8);
        headA.add(4);
        headA.add(5);
        ListNode headB = new ListNode(5);
        headB.add(0);
        headB.add(1);
        headB.add(8);
        headB.add(4);
        headB.add(5);
        System.out.println(obj.getIntersectionNode(headA, headB).val);
    }

    public ListNode getIntersectionNode(ListNode headA, ListNode headB){

        int len_a = 0, len_b = 0;
        ListNode temp_a = headA;
        ListNode temp_b = headB;
        while (temp_a != null){
            len_a++;
            temp_a = temp_a.next;
        }
        while (temp_b != null){
            len_b++;
            temp_b = temp_b.next;
        }
        int dif = Math.abs(len_a - len_b);
        while (dif-- > 0){
            if(len_a > len_b) headA = headA.next;
            else headB = headB.next;
        }
        //跟原题不同的是：
        //这里判断两个不同的链表第一个相等的点在哪
        while (headA != null && headB != null){
            //若要实现原题的要求，这里改为(headA.equals(headB)即可)
            if (headA.val == headB.val){
                return headA;
            }else {
                headA = headA.next;
                headB = headB.next;
            }
        }
        return null;
    }
}

class ListNode{
    int val;
    ListNode next;
    ListNode(int x){
        val = x;
        next = null;
    }

    public void add(int x){
        ListNode newnode = new ListNode(x);
        if (this.next == null){
            this.next = newnode;
        }else {
            this.next.add(x);
        }
    }
}
